﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;
using System.Reflection;

namespace System.ServiceModel.Helpers
{

    internal static class Helpers
    {


        public static void SetVariable(this ILGenerator gen, LocalBuilder variable)
        {

            switch (variable.LocalIndex)
            {

                case 0:
                    gen.Emit(OpCodes.Stloc_0);
                    break;

                case 1:
                    gen.Emit(OpCodes.Stloc_1);
                    break;

                case 2:
                    gen.Emit(OpCodes.Stloc_2);
                    break;

                case 3:
                    gen.Emit(OpCodes.Stloc_3);
                    break;

                default:
                    gen.Emit(OpCodes.Stloc_S, variable.LocalIndex);
                    break;
            }

        }

        public static void GetVariable(this ILGenerator gen, LocalBuilder variable)
        {

            switch (variable.LocalIndex)
            {

                case 0:
                    gen.Emit(OpCodes.Ldloc_0);
                    break;

                case 1:
                    gen.Emit(OpCodes.Ldloc_1);
                    break;

                case 2:
                    gen.Emit(OpCodes.Ldloc_2);
                    break;

                case 3:
                    gen.Emit(OpCodes.Ldloc_3);
                    break;

                default:
                    gen.Emit(OpCodes.Ldloc_S, variable.LocalIndex);
                    break;
            }

        }

        /// <summary>
        /// Writes the parameter argument.
        /// </summary>
        /// <param name="gen">The gen.</param>
        /// <param name="parameter">The parameter.</param>
        public static void WriteParameterArgument(this ILGenerator gen, ParameterInfo parameter)
        {

            int position = parameter.Position + 1;

            switch (position)
            {
                //case 0:
                //    gen.Emit(OpCodes.Ldarg_0);
                //    break;
                case 1:
                    gen.Emit(OpCodes.Ldarg_1);
                    break;
                case 2:
                    gen.Emit(OpCodes.Ldarg_2);
                    break;
                case 3:
                    gen.Emit(OpCodes.Ldarg_3);
                    break;
                default:
                    gen.Emit(OpCodes.Ldarg_S, position);
                    break;
            }

        }

        public static void WriteInteger(this ILGenerator gen, int value)
        {

            switch (value)
            {
                case 0:
                    gen.Emit(OpCodes.Ldc_I4_0);
                    break;

                case 1:
                    gen.Emit(OpCodes.Ldc_I4_1);
                    break;

                case 2:
                    gen.Emit(OpCodes.Ldc_I4_2);
                    break;

                case 3:
                    gen.Emit(OpCodes.Ldc_I4_3);
                    break;

                case 4:
                    gen.Emit(OpCodes.Ldc_I4_4);
                    break;

                case 5:
                    gen.Emit(OpCodes.Ldc_I4_5);
                    break;

                case 6:
                    gen.Emit(OpCodes.Ldc_I4_6);
                    break;

                case 7:
                    gen.Emit(OpCodes.Ldc_I4_7);
                    break;

                case 8:
                    gen.Emit(OpCodes.Ldc_I4_8);
                    break;

                default:
                    gen.Emit(OpCodes.Ldc_I4, value);
                    break;
            }
        
        }

    }
}
